package org.frankkie.parcdroidprj;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.location.Location;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import java.util.ArrayList;

/**
 *
 * @author frankkie
 */
public class OverlayDinges extends Overlay {

  public static ArrayList<OverlayPunt> gpsPlekken = new ArrayList<OverlayPunt>();
  public static ArrayList<OverlayLijn> deLijnen = new ArrayList<OverlayLijn>();
  public static int lijnDieHetDichtsteBijIs = -1;
  public static OverlayLijn lijnDieHetDichtsteBijIsLijn = null;
  public static boolean doeOokNietEftelingPlekken = true;

  /**
   * @return the gpsPlekken
   */
  public static ArrayList<OverlayPunt> getGpsPlekken() {
    return gpsPlekken;
  }

  /**
   * @param aGpsPlekken the gpsPlekken to set
   */
  public static void setGpsPlekken(ArrayList<OverlayPunt> aGpsPlekken) {
    gpsPlekken = aGpsPlekken;
  }

  /**
   * @return the deLijnen
   */
  public static ArrayList<OverlayLijn> getDeLijnen() {
    return deLijnen;
  }

  /**
   * @param aDeLijnen the deLijnen to set
   */
  public static void setDeLijnen(ArrayList<OverlayLijn> aDeLijnen) {
    deLijnen = aDeLijnen;
  }

  /**
   * @return the lijnDieHetDichtsteBijIs
   */
  public static int getLijnDieHetDichtsteBijIs() {
    return lijnDieHetDichtsteBijIs;
  }

  /**
   * @param aLijnDieHetDichtsteBijIs the lijnDieHetDichtsteBijIs to set
   */
  public static void setLijnDieHetDichtsteBijIs(int aLijnDieHetDichtsteBijIs) {
    lijnDieHetDichtsteBijIs = aLijnDieHetDichtsteBijIs;
  }

  /**
   * @return the doeOokNietEftelingPlekken
   */
  public static boolean isDoeOokNietEftelingPlekken() {
    return doeOokNietEftelingPlekken;
  }

  /**
   * @param aDoeOokNietEftelingPlekken the doeOokNietEftelingPlekken to set
   */
  public static void setDoeOokNietEftelingPlekken(boolean aDoeOokNietEftelingPlekken) {
    doeOokNietEftelingPlekken = aDoeOokNietEftelingPlekken;
  }

  public OverlayDinges() {

    //Er wordt van af nu niet meer gekeken naar de Index in de ArrayList,
    //Maar naar het volgnummer !

    gpsPlekken.add(new OverlayPunt(51.652872, 5.042809, 0, "Parkeerplaats", "Begin van de parkeerplaats"));
    gpsPlekken.add(new OverlayPunt(51.650568, 5.043443, 1, "Parkeerplaats", "bijna bij Huis van de 5 zintuigen"));
    gpsPlekken.add(new OverlayPunt(51.649579, 5.043689, 2, "Ingang", "Huis van de 5 Zintuigen"));
    gpsPlekken.add(new OverlayPunt(51.649369, 5.044220, 3, "Een Plein", "Plein Voorbij de ingang"));
    gpsPlekken.add(new OverlayPunt(51.649386, 5.045084, 4, "Een Plein", "Plein Voorbij de ingang, verder het park in."));
    gpsPlekken.add(new OverlayPunt(51.649126, 5.045165, 5, "Plein", "Plein iets zuidelijker."));
    gpsPlekken.add(new OverlayPunt(51.649180, 5.046790, 6, "Hoofdpad", "het Midden van het Hoofdpad, bij pandadroom"));
    gpsPlekken.add(new OverlayPunt(51.649349, 5.047884, 7, "Hoofdpad", "verder op het Hoofdpad"));
    gpsPlekken.add(new OverlayPunt(51.649988, 5.048694, 8, "Hoofdpad", "Bij rondKruisPunt"));
    gpsPlekken.add(new OverlayPunt(51.650102, 5.049864, 9, "rondKruisPunt", "op het ronde kruispunt"));
    gpsPlekken.add(new OverlayPunt(51.650508, 5.049102, 10, "rondKruisPunt", "noord van rondkruispunt"));
    gpsPlekken.add(new OverlayPunt(51.650434, 5.048480, 11, "leuk pad", "noord-west van rondkruispunt"));
    gpsPlekken.add(new OverlayPunt(51.65064, 5.048212, 12, "leuk pad", "nog op het leuke pad"));
    gpsPlekken.add(new OverlayPunt(51.651271, 5.048317, 13, "leuk pad", "bij plein voor stoomcarousel"));
    gpsPlekken.add(new OverlayPunt(51.651457, 5.048829, 14, "Plein voor Stoomcarousel", "plein voor Stoomcarousel"));
    /////////
    deLijnen.add(new OverlayLijn(0, 1));
    deLijnen.add(new OverlayLijn(1, 2));
    deLijnen.add(new OverlayLijn(2, 3));
    deLijnen.add(new OverlayLijn(3, 4));
    deLijnen.add(new OverlayLijn(4, 5));
    deLijnen.add(new OverlayLijn(5, 6));
    deLijnen.add(new OverlayLijn(6, 7));
    deLijnen.add(new OverlayLijn(7, 8));
    deLijnen.add(new OverlayLijn(8, 9));
    deLijnen.add(new OverlayLijn(9, 10));
    deLijnen.add(new OverlayLijn(10, 11));
    deLijnen.add(new OverlayLijn(11, 12));
    deLijnen.add(new OverlayLijn(12, 13));
    deLijnen.add(new OverlayLijn(13, 14));
    //////
    if (doeOokNietEftelingPlekken) {
      //VANAF NU BEGINT HET VOLGNUMMER VAN EEN NIET-EFTELING PUNT MET EEN 9
      gpsPlekken.add(new OverlayPunt(51.965141, 4.558543, 914, "Huis", "in Mijn Huis"));
      gpsPlekken.add(new OverlayPunt(51.965229, 4.558724, 915));
      gpsPlekken.add(new OverlayPunt(51.9651, 4.558826, 916));
      gpsPlekken.add(new OverlayPunt(51.964697, 4.55902, 917));
      gpsPlekken.add(new OverlayPunt(51.965223, 4.559593, 918));
      gpsPlekken.add(new OverlayPunt(51.965553, 4.559454, 919));
      gpsPlekken.add(new OverlayPunt(51.965361, 4.560446, 920));
      gpsPlekken.add(new OverlayPunt(51.966013, 4.560189, 921));
      gpsPlekken.add(new OverlayPunt(51.96636, 4.560033, 922));
      gpsPlekken.add(new OverlayPunt(51.965854, 4.55917, 923));
      gpsPlekken.add(new OverlayPunt(51.965897, 4.559433, 924));
      gpsPlekken.add(new OverlayPunt(51.966122, 4.558381, 925));
      gpsPlekken.add(new OverlayPunt(51.966224, 4.559191, 926));
      gpsPlekken.add(new OverlayPunt(51.965758, 4.558507, 927));
      gpsPlekken.add(new OverlayPunt(51.966326, 4.559795, 928));
      gpsPlekken.add(new OverlayPunt(51.966842, 4.559559, 929));
      gpsPlekken.add(new OverlayPunt(51.966604, 4.558164, 930));
      //
      gpsPlekken.add(new OverlayPunt(51.965068, 4.560603, 931));
      gpsPlekken.add(new OverlayPunt(51.965214, 4.561524, 932));
      gpsPlekken.add(new OverlayPunt(51.965019, 4.562265, 933, "Metrostation", "Nieuw Verlaat")); //metro nieuw verlaat
      gpsPlekken.add(new OverlayPunt(51.965620, 4.561345, 934)); //zebrapad bij supermarkt
      gpsPlekken.add(new OverlayPunt(51.965650, 4.561866, 935, "Supermarkt", "Bas Van Der Heijden")); //supermarkt
      gpsPlekken.add(new OverlayPunt(51.965877, 4.56124, 936)); //voor robert stolzhof
      gpsPlekken.add(new OverlayPunt(51.966525, 4.560972, 937));
      //
      gpsPlekken.add(new OverlayPunt(51.964952, 4.558177, 938)); //Over het Bruggetje
      gpsPlekken.add(new OverlayPunt(51.96437, 4.558446, 939)); //schoutbontebalpad bij metro-overweg, bij Nieuw Verlaat
      gpsPlekken.add(new OverlayPunt(51.963768, 4.555801, 940)); //einde van 'het parkje'
      gpsPlekken.add(new OverlayPunt(51.963633, 4.555125, 941)); //MLK-weg bij metro-overweg, bij Hesseplaats
      gpsPlekken.add(new OverlayPunt(51.962882, 4.555323, 942)); //Oversteekplaats MLK-weg
      gpsPlekken.add(new OverlayPunt(51.96278, 4.554889, 943)); //Andere kant van de Oversteekplaats MLK-weg
      gpsPlekken.add(new OverlayPunt(51.962734, 4.553929, 944)); //Hesseplaats voor de AH
//      gpsPlekken.add(new OverlayPunt(51.962882, 4.555323, 945));
//      gpsPlekken.add(new OverlayPunt(51.962882, 4.555323, 946));
//      gpsPlekken.add(new OverlayPunt(51.962882, 4.555323, 947));
      //
      deLijnen.add(new OverlayLijn(914, 915));
      deLijnen.add(new OverlayLijn(915, 916));
      deLijnen.add(new OverlayLijn(916, 917));
      deLijnen.add(new OverlayLijn(916, 918));
      deLijnen.add(new OverlayLijn(918, 919));
      deLijnen.add(new OverlayLijn(918, 920));
      deLijnen.add(new OverlayLijn(920, 921));
      deLijnen.add(new OverlayLijn(921, 922));
      deLijnen.add(new OverlayLijn(921, 924));
      deLijnen.add(new OverlayLijn(924, 923));
      deLijnen.add(new OverlayLijn(924, 926));
      deLijnen.add(new OverlayLijn(922, 928));
      deLijnen.add(new OverlayLijn(928, 926));
      deLijnen.add(new OverlayLijn(925, 926));
      deLijnen.add(new OverlayLijn(925, 927));
      deLijnen.add(new OverlayLijn(927, 915));
      deLijnen.add(new OverlayLijn(928, 929));
      deLijnen.add(new OverlayLijn(929, 930));
      deLijnen.add(new OverlayLijn(930, 925));
      //
      deLijnen.add(new OverlayLijn(920, 931));
      deLijnen.add(new OverlayLijn(931, 932));
      deLijnen.add(new OverlayLijn(932, 933));
      deLijnen.add(new OverlayLijn(932, 934));
      deLijnen.add(new OverlayLijn(934, 935));
      deLijnen.add(new OverlayLijn(934, 936));
      deLijnen.add(new OverlayLijn(936, 937));
      deLijnen.add(new OverlayLijn(937, 922));
      //
      deLijnen.add(new OverlayLijn(916, 938));
      deLijnen.add(new OverlayLijn(938, 939));
      deLijnen.add(new OverlayLijn(939, 940));
      deLijnen.add(new OverlayLijn(940, 941));
      deLijnen.add(new OverlayLijn(941, 942));
      deLijnen.add(new OverlayLijn(942, 943));
      deLijnen.add(new OverlayLijn(943, 944));
//          deLijnen.add(new OverlayLijn(939,940));
    }
  }

  /* BIJNA GOED
  public void berekenAfstandenTotLijnen() {
  System.out.println("OverlayDinges.berekenAfstandenTotLijnen");
  double kortsteAfstand = -1;
  int welkeIsDatDan = -1;
  for (int a = 0; a < deLijnen.size(); a++) {
  OverlayLijn foo = deLijnen.get(a);
  Location lokatie = MainActivity.location;
  OverlayPunt p1 = gpsPlekken.get(foo.punt1);
  OverlayPunt p2 = gpsPlekken.get(foo.punt2);
  foo.afstandTotGPS = AfstandLijnPunt.distanceToSegment(
  lokatie.getLongitude(), lokatie.getLatitude(), //Huidige GPS Positie
  p1.geoPoint.getLatitudeE6() / 1E6, p1.geoPoint.getLatitudeE6() / 1E6, //P1 van de lijn
  p2.geoPoint.getLatitudeE6() / 1E6, p2.geoPoint.getLatitudeE6() / 1E6);  //P2 van de lijn
  if (kortsteAfstand == -1) {
  kortsteAfstand = foo.afstandTotGPS;
  welkeIsDatDan = a;
  }
  if (kortsteAfstand > foo.afstandTotGPS){
  kortsteAfstand = foo.afstandTotGPS;
  welkeIsDatDan = a;
  }
  deLijnen.set(a, foo);
  }
  lijnDieHetDichtsteBijIs = welkeIsDatDan;
  }
   */
  public void berekenAfstandenTotLijnen() {
    System.out.println("OverlayDinges.berekenAfstandenTotLijnen");
    double kortsteAfstand = -1;
    int welkeIsDatDan = -1;
    for (int a = 0; a < getDeLijnen().size(); a++) {
      OverlayLijn foo = getDeLijnen().get(a);
      Location lokatie = MainActivity.location;
      OverlayPunt p1 = foo.getPunt1();
      OverlayPunt p2 = foo.getPunt2();
      foo.setAfstandTotGPS(AfstandLijnPunt.distanceToSegment(lokatie.getLongitude(), lokatie.getLatitude(), p1.getGeoPoint().getLongitudeE6() / 1E6, p1.getGeoPoint().getLatitudeE6() / 1E6, p2.getGeoPoint().getLongitudeE6() / 1E6, p2.getGeoPoint().getLatitudeE6() / 1E6));  //P2 van de lijn
      if (kortsteAfstand == -1) {
        kortsteAfstand = foo.getAfstandTotGPS();
        welkeIsDatDan = a;
      }
      if (kortsteAfstand > foo.getAfstandTotGPS()) {
        kortsteAfstand = foo.getAfstandTotGPS();
        welkeIsDatDan = a;
      }
      getDeLijnen().set(a, foo);
    }
    setLijnDieHetDichtsteBijIs(welkeIsDatDan);
    lijnDieHetDichtsteBijIsLijn = getDeLijnen().get(welkeIsDatDan);
  }

  @Override
  public void draw(Canvas canvas, MapView mv, boolean shadow) {
    //PixelCalculator: You need to use MapView.getProjection().toPixels() and .fromPixels().
    // ... [ draw things here ] ...
    Paint paint = new Paint();
    int aantalGpsPlekken = getGpsPlekken().size();
    for (int a = 0; a < aantalGpsPlekken; a++) {
      Point p1 = mv.getProjection().toPixels(getGpsPlekken().get(a).getGeoPoint(), null);
      RectF r1 = new RectF();
      int grootte = getGpsPlekken().get(a).getGrootte();
      r1.set(p1.x - grootte, p1.y - grootte, p1.x + grootte, p1.y + grootte);
      paint.setColor(getGpsPlekken().get(a).getKleur());
      canvas.drawOval(r1, paint);
    }
    int aantalLijnen = getDeLijnen().size();
    for (int b = 0; b < aantalLijnen; b++) {
      Point punt1 = mv.getProjection().toPixels(getDeLijnen().get(b).getPunt1().getGeoPoint(), null);
      Point punt2 = mv.getProjection().toPixels(getDeLijnen().get(b).getPunt2().getGeoPoint(), null);
      //if (b == getLijnDieHetDichtsteBijIs()){
      if (getDeLijnen().get(b).equals(lijnDieHetDichtsteBijIsLijn)) {
        paint.setColor(Color.RED);
      } else {
        paint.setColor(Color.BLACK);
      }
      canvas.drawLine(punt1.x, punt1.y, punt2.x, punt2.y, paint);
    }
  }
}
